using System.Collections.Generic;

namespace Rsdn.Janus
{
    /// <summary>
    /// 
    /// </summary>
    public interface IOutboxManager : IOutboxManagerBase
    {
        /// <summary>
        /// Gets the rate marks.
        /// </summary>
        /// <value>The rate marks.</value>
        IOutboxRateCollection RateMarks { get; }

        /// <summary>
        /// Gets the download topics.
        /// </summary>
        /// <value>The download topics.</value>
        IDownloadTopicCollection DownloadTopics { get; }

        /// <summary>
        /// Adds the topic for download.
        /// </summary>
        /// <param name="mid">The message id.</param>
        void AddTopicForDownload(int mid);

        /// <summary>
        /// Adds the topic for download with confirm.
        /// </summary>
        /// <param name="mid">The message id.</param>
        void AddTopicForDownloadWithConfirm(int mid);

        /// <summary>
        /// Adds the bug report.
        /// </summary>
        /// <param name="bugName">Name of the bug.</param>
        /// <param name="bugDescription">The bug description.</param>
        /// <param name="stackTrace">The stack trace.</param>
        /// <param name="showEditor">if set to <c>true</c> [show editor].</param>
        void AddBugReport(
            string bugName,
            string bugDescription,
            string stackTrace,
            bool showEditor);

        /// <summary>
        /// Gets the locked message ids.
        /// </summary>
        /// <returns></returns>
        Dictionary<int, bool> GetLockedMessageIds();

        /// <summary>
        /// Locks the message.
        /// </summary>
        /// <param name="id">The id.</param>
        void LockMessage(int id);

        /// <summary>
        /// Releases the message.
        /// </summary>
        /// <param name="id">The id.</param>
        void ReleaseMessage(int id);

        /// <summary>
        /// Gets a value indicating whether is allowed to edit messages.
        /// </summary>
        /// <value>
        ///   <c>true</c> if this instance is allowed edit messages; otherwise, <c>false</c>.
        /// </value>
        bool IsAllowedEditMessages { get; }

        /// <summary>
        /// Locks the message editing.
        /// </summary>
        void LockMessageEditing();

        /// <summary>
        /// Releases the message editing.
        /// </summary>
        void ReleaseMessageEditing();
    }
}